Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Factor</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Factor"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Factor rootpage-Factor skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Factor</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr">
<table class="float-right infobox toccolours toptextcells" style="font-size:90%; margin-top:0; width:21em;">

<tbody><tr>
<th colspan="2" class="hintergrundfarbe6" style="font-size:larger;">Factor
</th></tr>




<tr>
<th colspan="2" class="hintergrundfarbe5" style="font-size:105%; text-align:center;">Basisdaten
</th></tr>
<tr>
<td><b><a href="Programmierparadigma" title="Programmierparadigma">Paradigmen</a>:</b>
</td>
<td>multiparadigmatisch
</td></tr>
<tr>
<td><b>Erscheinungsjahr:</b>
</td>
<td>2003
</td></tr>
<tr>
<td><b>Designer:</b>
</td>
<td>Slava Pestov
</td></tr>

<tr>
<td><b>Entwickler:</b>
</td>
<td><span class="wikidata-content">Slava Pestov</span>
</td></tr>
<tr>
<td><b>Aktuelle&nbsp;<a href="Version_(Software)" title="Version (Software)">Version</a>:</b>
</td>
<td style="white-space:nowrap;">0.100 &nbsp;<small>(August 2025)</small>
</td></tr>


<tr>
<td><b><a href="Typisierung_(Informatik)" title="Typisierung (Informatik)">Typisierung</a>:</b>
</td>
<td><a href="Dynamische_Typisierung" title="Dynamische Typisierung">dynamisch</a>
</td></tr>






<tr>
<td><b>Beeinflusst von:</b>
</td>
<td><a href="Forth_(Programmiersprache)" title="Forth (Programmiersprache)">Forth</a>, <a href="Lisp" title="Lisp">Lisp</a>, <a href="Smalltalk_(Programmiersprache)" title="Smalltalk (Programmiersprache)">Smalltalk</a>, <a href="Joy_(Programmiersprache)" title="Joy (Programmiersprache)">Joy</a>
</td></tr>




<tr>
<td><b><a href="Lizenz" title="Lizenz">Lizenz</a>:</b>
</td>
<td><a href="BSD-Lizenz" title="BSD-Lizenz">BSD-Lizenz</a>
</td></tr>
<tr>
<td colspan="2" class="hintergrundfarbe5" style="text-align:center;"><a rel="nofollow" class="external text" href="http://factorcode.org/">factorcode.org</a>
</td></tr></tbody></table>
<p><b>Factor</b> ist eine <a href="Freie_Software" title="Freie Software">freie</a> <a href="Programmiersprache" title="Programmiersprache">Programmiersprache</a>, die von Slava Pestov entworfen und seit 2003 entwickelt wird. Sie übernimmt Konzepte aus <a href="Forth_(Programmiersprache)" title="Forth (Programmiersprache)">Forth</a>, <a href="Lisp" title="Lisp">Lisp</a> und <a href="Smalltalk_(Programmiersprache)" title="Smalltalk (Programmiersprache)">Smalltalk-80</a>. Sie ist als praxisorientierter Nachfolger von <a href="Joy_(Programmiersprache)" title="Joy (Programmiersprache)">Joy</a> gedacht und eine Implementierung ist unter <a href="BSD-Lizenz" title="BSD-Lizenz">BSD-Lizenz</a> erhältlich.
</p>

<div class="mw-heading mw-heading2"><h2 id="Words_und_Stack">Words und Stack</h2></div>
<p>Alle Funktionen lesen ihre Argumente vom <a href="Stapelspeicher" title="Stapelspeicher">Stack</a>, schreiben ihre Ergebnisse auf den Stack und werden als <b>words</b> bezeichnet. Ein Programm ist eine Abfolge von Lexikalen für Objekte, die auf den Stack abgelegt werden und words, die auf den Stack angewendet werden.
</p>
<div class="mw-highlight mw-highlight-lang-factor mw-content-ltr" dir="ltr"><pre><span></span><span class="c">! Kommentar</span>
<span class="m">2 3 </span><span class="nb">+</span><span class="w"> </span><span class="m">.</span>
</pre></div>
<p>Zuerst werden 2 und 3 auf den Stack abgelegt. <b>+</b>&nbsp;nimmt zwei Zahlen vom Stack und legt die Summe der beiden auf dem Stack ab. <b>.</b>&nbsp;nimmt das oberste Objekt vom Stack und gibt es aus. <a href="Kommentar_(Programmierung)" title="Kommentar (Programmierung)">Kommentare</a> beginnen mit&nbsp;<b>!</b> und gehen bis zum Ende der Zeile.
</p>
<div class="mw-highlight mw-highlight-lang-factor mw-content-ltr" dir="ltr"><pre><span></span><span class="k">:</span><span class="w"> </span><span class="nf">add2</span><span class="w"> </span><span class="nf">(</span><span class="w"> </span><span class="nv">n</span><span class="w"> </span><span class="nf">--</span><span class="w"> </span><span class="nv">n'</span><span class="w"> </span><span class="nf">)</span><span class="w"> </span><span class="m">2 </span><span class="nb">+</span><span class="w"> </span><span class="k">;</span>
<span class="m">5 </span>add2
</pre></div>
<p>Neue words werden mit <b>:</b> definiert. <i>add2</i> addiert 2 zur obersten Zahl auf dem Stack.
</p><p>Words werden in <b>vocabularies</b> zusammengefasst. Mit <b>USE:</b> wird angegeben, in welchem vocabulary words gesucht werden sollen und mit <b>IN:</b> in welchem vocabulary alle folgend definierten words gespeichert werden.
</p><p>Es können beliebige Objekte wie Zahlen, Sequences (Arrays, Vectors, Strings,&nbsp;…) usw. auf dem Stack abgelegt werden. Für alle Objektarten ist eine lexikalische Darstellung definiert.
</p>
<div class="mw-highlight mw-highlight-lang-factor mw-content-ltr" dir="ltr"><pre><span></span><span class="k">SYMBOL:</span><span class="w"> </span><span class="nf">foo</span>
<span class="s">"Hello"</span><span class="w"> </span>foo<span class="w"> </span><span class="nb">set</span>
foo<span class="w"> </span><span class="nb">get</span>
</pre></div>
<p>Namen für Variablen werden mit <b>SYMBOL:</b> definiert, mit <b>set</b> gesetzt und mit <b>get</b> ausgelesen und auf den Stack abgelegt. Speicher für die Objekte wird automatisch alloziert und durch die <a href="Garbage_Collection" title="Garbage Collection">Garbage Collection</a> wieder freigegeben.
</p>
<div class="mw-heading mw-heading2"><h2 id="Funktionales_Programmieren">Funktionales Programmieren</h2></div>
<p>Anonyme Funktionen werden in eckigen Klammern geschrieben und als <b>quotations</b> bezeichnet.
</p>
<div class="mw-highlight mw-highlight-lang-factor mw-content-ltr" dir="ltr"><pre><span></span>{<span class="w"> </span><span class="m">1 2 3 </span>}<span class="w"> </span>[<span class="w"> </span><span class="m">3 </span><span class="nb">+</span><span class="w"> </span>]<span class="w"> </span><span class="nb">map</span>
<span class="m">10 </span>[<span class="w"> </span><span class="s">"Hello world"</span><span class="w"> </span><span class="nb">print</span><span class="w"> </span>]<span class="w"> </span><span class="nb">times</span>
<span class="m">4 </span>[<span class="w"> </span><span class="m">2 </span><span class="nb">+</span><span class="w"> </span>]<span class="w"> </span>[<span class="w"> </span><span class="m">3 </span><span class="nb">*</span><span class="w"> </span>]<span class="w"> </span><span class="nb">bi</span>
<span class="m">10 0 </span><span class="nb">&lt;</span><span class="w"> </span>[<span class="w"> </span><span class="s">"yes"</span><span class="w"> </span><span class="nb">print</span><span class="w"> </span>]<span class="w"> </span>[<span class="w"> </span><span class="s">"no"</span><span class="w"> </span><span class="nb">print</span><span class="w"> </span>]<span class="w"> </span><span class="nb">if</span>
</pre></div>
<p><b>map</b> nimmt ein Array und eine quotation vom Stack. Die quotation wird auf jedes Element des Arrays angewendet und die Ergebnisse wieder in einem Array auf dem Stack abgelegt. <b>times</b> nimmt eine Zahl <i>n</i> und eine quotation vom Stack. Die quotation wird dann <i>n</i>-mal hintereinander ausgeführt. <b>bi</b> nimmt ein Objekt und zwei quotations vom Stack. Beide quotations werden auf das Objekt angewendet und die beiden Ergebnisse auf dem Stack abgelegt. <b>if</b> nimmt einen <a href="Boolesche_Variable" class="mw-redirect" title="Boolesche Variable">Wahrheitswert</a> und zwei quotations vom Stack. Ist der Wert <i>true</i> wird die erste quotation ausgeführt, ansonsten die zweite quotation.
</p>
<div class="mw-heading mw-heading2"><h2 id="Objektorientierung">Objektorientierung</h2></div>
<p>Bei der Objektorientierung übernimmt Factor Konzepte aus <a href="Common_Lisp_Object_System" title="Common Lisp Object System">Common Lisp Object System</a>. Klassen und Methoden werden unabhängig voneinander definiert.
</p>
<div class="mw-highlight mw-highlight-lang-factor mw-content-ltr" dir="ltr"><pre><span></span><span class="k">TUPLE:</span><span class="w"> </span><span class="nc">rectangle</span><span class="w"> </span><span class="nv">width</span><span class="w"> </span><span class="nv">height</span><span class="w"> </span><span class="k">;</span>
<span class="k">:</span><span class="w"> </span><span class="nf">&lt;rectangle&gt;</span><span class="w"> </span><span class="nf">(</span><span class="w"> </span><span class="nv">width</span><span class="w"> </span><span class="nv">height</span><span class="w"> </span><span class="nf">--</span><span class="w"> </span><span class="nv">rectangle</span><span class="w"> </span><span class="nf">)</span><span class="w"> </span>rectangle<span class="w"> </span><span class="nb">boa</span><span class="w"> </span><span class="k">;</span>

<span class="k">GENERIC:</span><span class="w"> </span><span class="nf">area</span><span class="w"> </span><span class="nf">(</span><span class="w"> </span><span class="nv">object</span><span class="w"> </span><span class="nf">--</span><span class="w"> </span><span class="nv">x</span><span class="w"> </span><span class="nf">)</span>
<span class="k">M:</span><span class="w"> </span><span class="nc">rectangle</span><span class="w"> </span><span class="nf">area</span><span class="w"> </span>[<span class="w"> </span>width&gt;&gt;<span class="w"> </span>]<span class="w"> </span>[<span class="w"> </span>height&gt;&gt;<span class="w"> </span>]<span class="w"> </span><span class="nb">bi</span><span class="w"> </span><span class="nb">*</span><span class="w"> </span><span class="k">;</span>

<span class="m">10 20 </span>&lt;rectangle&gt;<span class="w"> </span>area
</pre></div>
<p>Zur <a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">Datenkapselung</a> wird eine Tuple-Klasse mit dem Namen <i>rectangle</i> und den beiden Slots <i>width</i> und <i>height</i> definiert. Das darauf folgend definierte <b>construction-word</b> <i>&lt;rectangle&gt;</i> liest zwei Zahlen vom Stack und belegt die beiden Slots damit. Die für <i>rectangle</i> definierte Methode <i>area</i> nimmt ein rectangle-Objekt vom Stack und berechnet die Fläche. Liegt ein Tuple-Objekt auf dem Stack, können mit <b>slot&gt;&gt;</b> die Daten ausgelesen und mit <b>&gt;&gt;slot</b> die Daten in den Slot des Objekts geschrieben werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Library">Library</h2></div>
<p>In Factor ist eine umfassende <a href="Programmbibliothek" title="Programmbibliothek">Bibliothek</a> mit vordefinierten Funktionen enthalten. Für Erweiterungen existiert eine Schnittstelle zu C-Bibliotheken.
</p>
<div class="mw-heading mw-heading2"><h2 id="Listener">Listener</h2></div>

<p>Der Listener ist die interaktive <a href="Integrierte_Entwicklungsumgebung" title="Integrierte Entwicklungsumgebung">Entwicklungsumgebung</a> von Factor. Alles was man eingibt wird eingelesen, kompiliert und gegebenenfalls gleich ausgeführt. Mit Steuerung-h gelangt man zu einer umfassenden Hilfe und mit Steuerung-w kann man jede Zeile im Single-Step-Verfahren schrittweise durchlaufen. Alle zurzeit im Speicher befindlichen Definitionen und der kompilierte Code werden mit <b>save</b> in einer <b>Image</b>-Datei gespeichert.
</p>
<div class="mw-heading mw-heading2"><h2 id="Implementierung">Implementierung</h2></div>
<p>Die <a href="Virtuelle_Maschine" title="Virtuelle Maschine">VM</a> von Factor ist in <a href="C%2B%2B" title="C++">C++</a> geschrieben. Der größte Teil von Factor, wie der <a href="Parser" title="Parser">Parser</a> und der <a href="Compiler" title="Compiler">Compiler</a>, sind selbst in Factor geschrieben. Es existieren Implementierungen für <a href="FreeBSD" title="FreeBSD">FreeBSD</a>, <a href="Linux" title="Linux">Linux</a>, <a href="MacOS" title="MacOS">macOS</a> und <a href="Windows" class="mw-redirect" title="Windows">Windows</a> sowie die Prozessoren <a href="X86-Prozessor" title="X86-Prozessor">x86</a>, <a href="AMD64" title="AMD64">x86-64</a> und <a href="PowerPC" title="PowerPC">PowerPC</a>. Am Anfang des Projektes war die VM in <a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> geschrieben. Diese wurde aufgrund technischer Unterlegenheit zunächst durch eine Implementierung in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> ersetzt.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Self-Hosting">Self-Hosting</h2></div>
<p>Da Factor hauptsächlich selbst in Factor geschrieben ist, muss zuerst das Basissystem mit einem Boot-Image erstellt werden. Ein passendes Boot-Image findet man auf der Homepage von Factor.
</p>
<div class="mw-highlight mw-highlight-lang-console mw-content-ltr" dir="ltr"><pre><span></span><span class="gp">$ </span>factor<span class="w"> </span>-i<span class="o">=</span>boot.&lt;cpu&gt;.image
</pre></div>
<p>Das dabei erstellte <b>factor.image</b> ist vom System abhängig und enthält das bei jedem Start geladene Basissystem von Factor.
</p>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://factorcode.org/">offizielle Webpräsenz</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://concatenative.org/wiki/view/Factor">Wiki über Factor</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://docs.factorcode.org/">Anleitung</a> (englisch)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="http://concatenative.org/wiki/view/Factor/Java%20Factor"><i>Factor/Java Factor.</i></a> In: <i>concatenative.org.</i><span class="Abrufdatum"> Abgerufen am 23.&nbsp;Mai 2012</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AFactor&amp;rft.title=Factor%2FJava+Factor&amp;rft.description=Factor%2FJava+Factor&amp;rft.identifier=&amp;rft.date=&amp;rft.language=en">&nbsp;</span></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-09-15" href="https://de.wikipedia.org/wiki/?title=Factor&amp;oldid=259768852">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>